<?php

namespace App\Http\Middleware;

use Closure;
use App\Admin;
use App\Role;
use App\Menu;
class adminRole
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {

        // return $next($request);
        
        //获取控制器方法
        $action=explode('@',$request->route()->getActionName());
        //其他路由
        if(count($action)<2){
            return $next($request);
        }

        // 临时页面
        function go($a,$b){
            GLOBAL $request;
            if($request->ajax()){
                return response()->json([
                    'status'=>$a,
                    'msg'=>$b
                ]);
            }else{
                return redirect('/admin/redirect')->with([
                    'url'=> $a,
                    'msg'=> $b
                ]);
            }
        }
        //-----------------------验证Token开始-------------------------
        //得到session对象
        $session_obj=$request->session();
        //Token参数是否存在
        if(!($session_obj->has('user_id')&&$session_obj->has('user_token'))){
            // dd('参数不存在');
            return redirect('/admin/loginIndex');
        }
        //所有session属性
        $sessions=$session_obj->all();
        $user_id=$sessions['user_id'];
        $user_token=$sessions['user_token'];
        $admin=Admin::select('token','role_id')->find($user_id);

        //用户是否存在
        if(!$admin){
            // dd('userid invalid');
            return go(url('/admin/loginIndex'),'用户已不存在，请重新登录,2秒后跳转');
        }

        //Token 是否有效
        if($admin->token!=$user_token){
            // dd('token invalid');
            return go(url('/admin/loginIndex'),'登录失效，请重新登录,2秒后跳转');
        };
        //-----------------------验证Token结束-------------------------

      
        //-----------------------无权限阻止访问验证开始-------------------------

        $role=Role::select('menu_ids')->find($admin->role_id);
        if(!$role){
            return go('','用户角色不存在,无权访问');
        }
        
        $controller_name=substr(strrchr($action[0],'\\'),1);
        $method_name=$action[1];
  

        //获取当前控制器方法的菜单id
        $where=[
            'controller_name'=>$controller_name,
            'method_name'=>$method_name,
        ];
        $menu=Menu::select('id')->where($where)->first();
        $menu_ids=explode(',',$role->menu_ids);
            

        if(!$menu){
            return go(105,'当前菜单未配置');
        }
        
        // 是否拥有权限
        if(!$menu||!in_array($menu->id,$menu_ids)){
            return go(105,'无权限操作');
        }

     
         
      
        // 22,23,25,27,28,29

        return $next($request);
    }
}
